Android如何配置访问凭证

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

使用Android SDK发起OSS请求,您需要配置访问凭证。阿里云服务会通过访问凭证验证您的身份信息和访问权限。您可以根据使用场景对认证和授权的要求,选择不同的方式提供凭证。

前提条件

在配置访问凭证前,您需要安装OSS Android SDK。详情请参见安装

初始化凭证提供者

凭证提供者选型

OSS支持多种方式初始化凭证提供者,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。

凭证提供者初始化方式

适用场景

是否需要提供前置的AKSTS Token

底层实现基于的凭证

凭证有效期

凭证轮转或刷新方式

方式一:使用AK

部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务

AK

长期

手动轮转

方式二:使用STS Token

部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限

STS Token

临时

自定义

方式三:使用CredentialsURI

需要通过外部系统获取访问凭证的应用程序

STS Token

临时

自动刷新

方式一:使用AK

如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的OSS,且不能频繁轮转凭证时,您可以使用阿里云主账号或RAM用户的AK(Access Key ID、Access Key Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。如何获取AK,请参见CreateAccessKey - 创建主账号或RAM用户访问密钥

警告

此方式存在安全问题,移动端不推荐使用。阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,如果需要使用此方式,建议使用最小化授权的RAM用户的AK。

代码示例

String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";

OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ak, sk);

方式二:使用STS Token

如果您的应用程序需要临时访问OSS,细化访问控制,实时调整权限,以提高安全性和灵活性,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key SecretSecurity Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。如何获取STS Token,请参见AssumeRole - 获取扮演角色的临时身份凭证

您可以在代码中使用AKSecurity Token来引用凭证,以下为使用凭证更新StsToken的示例。

手动更新StsToken

String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";

OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);

自动更新StsToken

OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
    @Override
    public OSSFederationToken getFederationToken() {

        /* 获取ak/sk/token/expiration,
         * 示例从应用服务器获取ak/sk/token/expiration:
         * URL stsUrl = new URL("<server_url>");
         * HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
         * InputStream input = conn.getInputStream();
         * String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
         * JSONObject jsonObjs = new JSONObject(jsonText);
         * String ak = jsonObjs.getString("AccessKeyId");
         * String sk = jsonObjs.getString("AccessKeySecret");
         * String token = jsonObjs.getString("SecurityToken");
         * String expiration = jsonObjs.getString("Expiration");
         */
        String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
        String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
        String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
        String expiration = "<ALIBABA_CLOUD_EXPIRATION>";

        // 用ak/sk/token/expiration构建OSSFederationToken
        OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, expiration);
        return federationToken;
    }
};

方式三:使用CredentialsURI

如果您的应用程序需要通过外部系统或自定义配置获取和自动更新阿里云凭证,从而实现灵活的凭证管理和无密钥访问,您可以使用CredentialsURI初始化凭证提供者。该方式底层实现是STS Token。Credentials工具通过您提供的URI获取STS Token,完成凭证客户端初始化。该方式无需您提供一个AKSTS Token,消除了手动维护AKSTS Token的风险。

  1. 为了使Credentials工具正确解析和使用STS Token,URI必须遵循以下响应协议:

    • 响应状态码:200

    • 响应体结构:

      {
        "StatusCode":200,
        "AccessKeyId":"AccessKeyId",
        "AccessKeySecret":"AccessKeySecret",
        "Expiration":"2015-11-03T09:52:59Z",
        "SecurityToken":"SecurityToken"
      }                    
  2. 配置URI凭证作为访问凭证。

    String authServerUrl = "<remote_url>";
    OSSAuthCredentialsProvider credentialProvider = new OSSAuthCredentialsProvider(authServerUrl);
    /* 如果数据被加密,可通过如下代码解密
     * credentialProvider.setDecoder(new OSSAuthCredentialsProvider.AuthDecoder() {
     *     @Override
     *     public String decode(String data) {
     *         String result = null;
     *         // 解密
     *         // result = ...
     *         return result;
     *     }
     * });
     */